package com.somewater.game.controllers
{
	import com.somewater.game.GameModule;
	import com.somewater.storage.InfoDef;
	
	import flash.events.Event;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	
	/**
	 * Хранение пространственной позиции игровых объектов
	 */
	public class Spatial extends Component
	{
		public const G:Number = 0.03;
		
		public var leftCupRef:Rectangle;
		public var rightCupRef:Rectangle;
		public var lavaRef:Point;//  на самом деле учитывается только Y координата
		
		public var x:Number = 300;
		public var y:Number = 300;
		
		public var vx:Number = 0;
		public var vy:Number = 0;
		
		public var ax:Number = 0;
		public var ay:Number = 0;		
		
		
		public function Spatial(owner:Entity)
		{
			super(owner);
			
			leftCupRef = SpatialController.instance.leftCupRef;
			rightCupRef = SpatialController.instance.rightCupRef;
			lavaRef = SpatialController.instance.lavaRef;
		}
		
		
		override public function clear():void
		{
			super.clear();
		}
		
		
		/**
		 * Обновить объект согласно его скорости, ускорению и т.д.
		 */
		public function onTick(deltaTime:Number):void
		{
			var lastX:Number = x;
			var lastY:Number = y;
			
			x += vx * deltaTime;
			y += vy * deltaTime;
			
			vx += ax * deltaTime;
			vy += ay * deltaTime;
			
			
			if(owner.itsMe)
			{
				//управление
				if(vx == 0)
				{
					if(GameModule.leftKey())
						vx = -0.1;
					else if(GameModule.rightKey())
						vx = 0.1;
				}else if(GameModule.leftKey() == false && GameModule.rightKey() == false)
				{
					vx = 0;
				}
				
				if(GameModule.upKey() && vy == 0)
				{
					vy = 0.3;
					//ay = 0.05;
				}else{
					vy = 0;
				}
				
			}
			
			
			// проверки на пеересечения. Если найдены, олбнулить скорость и ускорение
			var caps:Array = [leftCupRef, rightCupRef];
			var inAir:Boolean = true;// объект висит в воздухе
			for(var s:String in caps)
			{
				var cupRef:Rectangle = caps[s];
				if(x > cupRef.x && x < cupRef.right && y < cupRef.y && y > (cupRef.y - cupRef.height))
				{
					// проверить, куда приходится пеерсечение, просто на плоскость или вбок
					if(lastY < cupRef.y)
					{
						// перелет по Y произошел ранее. Это боковое столкновение
						if(lastX < cupRef.x)
						{
							// пересечение слева
							x = cupRef.x;
						}
						else
						{
							x = cupRef.right;
						}
						
						vx = ax = 0;
					}
					else
					{
						vy = ay = 0;
						y = cupRef.y;
					}
					
					owner.dispatchEvent(new Event(Entity.ENTITY_COLLIDE));
				}
				
				if(y == cupRef.y && x > cupRef.x && x < cupRef.right)
					inAir = false;
			}
			
			if(inAir)
			{
				// проставить vy для падения вниз
				if(vy == 0)
					vy = -G;
			}
			
			// проверка на падение в лаву
			if(y < lavaRef.y)
			{
				owner.dispatchEvent(new Event(Entity.ENTITY_KILL));
			}
			
		}
	}
}